package com.j2ee.spring.aop.xml;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.junit.Test;

public class Transaction {
	
	/**
	 * 前置通知
	 * 		JoinPoint	连接点——客户端调用的方法
	 * 			通过该连接点可以获取方法的信息
	 */
	public void beginTransaction(JoinPoint joinPoint) {
		joinPoint.getArgs() ; //连接点的参数
		joinPoint.getTarget() ;	//目标类
		joinPoint.getSignature().getName() ;	//连接点的名称——客户端调用方法的名称
		System.out.println("begin transaction");
	}
	
	/**
	 * 后置通知
	 * @param object val ： 目标方法返回值参数，对应于
	 * 	<aop:after-returning returning="val"/>
	 */
	public void commit(JoinPoint joinPoint, Object val) {
		System.out.println(val);
		System.out.println("commit");
	}
	
	/**
	 * 最终通知
	 */
	public void finallyMethod() {
		System.out.println("finally method");
	}
	
	/**
	 * 异常通知：获取目标方法抛出的异常信息
	 * @param Throwable ex	： 异常信息参数，对应于
	 * <aop:after-throwing throwing="ex"/>
	 */
	public void throwingMethod(JoinPoint joinPoint, Throwable ex) {
		System.out.println(ex.getMessage());
	}
	
	/**
	 * 环绕通知
	 * @param joinPoint
	 * @throws Throwable
	 */
	public void aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("在目标方法调用之前");
		joinPoint.proceed(); //调用目标方法，与拦截器中的invoke方法类似
		System.out.println("在目标方法调用之后");
	}
	
	
	/**
	 * 输出Object类中所有的方法定义
	 */
	@Test
	public void test() {
		Class class1 = Object.class ;
		Method[] methods = class1.getMethods() ;
		for (Method method : methods) {
			System.out.println(method);
		}
	}

}
